package coop.bancocredicoop.proyectos.gd.procedure;

import java.io.ByteArrayInputStream;
import java.util.Date;

import coop.bancocredicoop.proyectos.gd.DocumentFile;
import coop.bancocredicoop.proyectos.gd.DocumentStream;
import coop.bancocredicoop.proyectos.gd.Usuario;
import coop.bancocredicoop.proyectos.gd.alfresco.AlfrescoHttpClient;
import coop.bancocredicoop.proyectos.gd.alfresco.Utils;
import coop.bancocredicoop.proyectos.gd.domain.Document;
import coop.bancocredicoop.proyectos.gd.query.document.FindDocumentById;
import coop.bancocredicoop.proyectos.gd.query.document.FindDocumentPreviousLastVersion;
import coop.bancocredicoop.proyectos.gd.query.document.UpdateDocumentSetDeleteFields;
import coop.bancocredicoop.proyectos.gd.service.DocumentCreationResult;
import coop.bancocredicoop.proyectos.gd.service.DocumentService;

public class AnularDocumentoProcedure {

	public Long run(Long documentId, String userName) throws Exception {

		Document document = new FindDocumentById().run(documentId);

		Document previousLastVersion = new FindDocumentPreviousLastVersion().
				run(document);

		DocumentCreationResult result = null;

		/*
		 * Se verifica si es posible volver a una version anterior del 
		 * documento.
		 */
		if (previousLastVersion != null) {
			/*
			 * Se recarga el documento en base a la version vieja a la
			 * que se esta volviendo.
			 */
			AlfrescoHttpClient alfrescoHttpClient = Utils.
					getAlfrescoClientFromConfigAsSystemUser();

			byte[] arrayByte = alfrescoHttpClient.
					getContentAsByteArray(previousLastVersion);

			DocumentStream documentFile = new DocumentStream(
					new ByteArrayInputStream(arrayByte));

			result = new DocumentService().
					createDocument(
							previousLastVersion.getCustomer().getIdPersona(),
							previousLastVersion.getBox().getCajaId(),
							previousLastVersion.getDocumentType().getId(),
							previousLastVersion.getValidTo(),
							previousLastVersion.getTags(),
							documentFile,
							new Usuario(previousLastVersion.
									getCreatedByUserName(), "", ""),
							previousLastVersion.getCreatedDate(),
							previousLastVersion.getNotes(),
							previousLastVersion.getRealVersion());

			if (!result.documentWasCreated())
				throw new RuntimeException("No se ha podido crear el " +
						"documento");

			/*
			 * Se marca como eliminada la version vieja, ya que
			 * no puede haber dos documento con deleteDate == null
			 * y la misma realVersion.
			 */
			new UpdateDocumentSetDeleteFields().run(previousLastVersion.
					getId(), new Date(), userName);

		}

		/*
		 * Se marca como eliminado el documento anulado.
		 */
		new UpdateDocumentSetDeleteFields().run(documentId,
				new Date(), userName);

		if (result != null)
			return result.getDocument().getId();
		else
			return null;

	}

}
